package com.aispeech.lyra.nativec.opensles;

import android.util.Log;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

/**
 * https://gitee.com/fxwubolin/opensles-recorder
 */
public class CRecorder {

    private static String TAG = "CRecorder";


    public boolean isInited = false;

    static {
        System.loadLibrary("lyra-native-lib");
    }

    private static DataListen dataListen;

    public void initRecordConfigIfNeed() {
        if (!isInited) {
            //只有  buffer_length 会生效
            int bufferLength = 1536 * 12; //bufferLength 不能传0
            initConfig(2, bufferLength);
        }
        isInited = true;
    }


    /**
     * 录音机数据回调到java
     */
    public static void dataAryCallback(byte[] data) {
        if (data == null) {
            Log.w(TAG, "data is null array.................");
        }else{
           // Log.w(TAG, "dataCallback bytedata:" + data.length);
            // byte[] finaData = shortArr2byteArr(data);
            //AudioDataSaver.instance.savePcmDatatoLocal(data);
            if (dataListen != null) {
                dataListen.nofifyPcmData(data);
            }
        }
    }


    /**
     * short[] 转换为 byte[]
     *
     * @param
     * @return
     */
    private static byte[] shortArr2byteArr(short[] shortArr) {
        byte[] byteArr = new byte[shortArr.length * 2];
        ByteBuffer.wrap(byteArr).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().put(shortArr);
        return byteArr;
    }

    /**
     * 录音机数据外传的监听器
     */
    public interface DataListen {

        public void nofifyPcmData(byte[] pcm);

    }

    public void setDataListen(DataListen dataListen) {
        this.dataListen = dataListen;
    }


///------------------------------------------------以下是JNI接口---------------------------------------------------------/////

    /**
     * 配置初始化
     * <p>
     * log_level 日志等级
     * buffer_length 缓存的音频buff大小
     */
    public native void initConfig(int log_level, int buffer_length);


    /**
     * 开始录音
     */
    public native void startRecord();


    /**
     * 结束录音
     */
    public native void stopRecord();

    /**
     * 是否在录音中
     * 每次开始录音和结束录音后，要间隔500ms左右才能判断出是否在录音中
     *
     * @return
     */
    public native boolean isInRecording();


}
